﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using Terrae.Datos.IDaos;
using Terrae.Clases;
using Terrae.Clases.FabricaClase;

namespace Terrae.Datos.DaoSqlServer
{
    public class DaoPersona: DaoSqlServer, IDaoPersona
    {
        #region Atributos

        private Conexion bd = new Conexion();
        SqlCommand command = new SqlCommand();
        //private Entidad _per = null; 
        private Entidad _miPersona = null;

        #endregion Atributos

        #region Métodos

        #region Agregar Persona

        /// <summary>
        /// Método que accede a la base de datos para insertar 
        /// a la persona.
        /// </summary>
        /// <param name="_persona"></param>
        /// <returns></returns>
        public bool AgregarPersona(Entidad _persona)
        {
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSPersona]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Nombre",
                (_persona as Persona).Nombre);
                command.Parameters.AddWithValue("@Apellido",
                (_persona as Persona).Apellido);
                command.Parameters.AddWithValue("@Fecha",
                (_persona as Persona).Fecha);
                command.Parameters.AddWithValue("@Correo",
                (_persona as Persona).Correo);
                command.Parameters.AddWithValue("@Usuario",
                (_persona as Persona).Usuario);
                command.Parameters.AddWithValue("@Clave",
                (_persona as Persona).Contrasena);
                command.Parameters.AddWithValue("@Celular",
                (_persona as Persona).Celular);

                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                bd.CerrarConexion();
            }
        }
        
        #endregion Agregar Persona

        #region Iniciar Sesion

        /// <summary>
        /// Método que accede a la base de datos para verificar los 
        /// datos ingresados por el usuario.
        /// </summary>
        /// <param name="_persona"></param>
        /// <returns></returns>
        public Entidad IniciarSesion(Entidad _persona)
        {
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELUsuario]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Usuario",
                (_persona as Persona).Usuario);
                command.Parameters.AddWithValue("@Clave",
                (_persona as Persona).Contrasena);

                SqlDataReader readers = command.ExecuteReader();

                if (readers.Read())
                {
                    _miPersona = FabricaEntidad.NuevaPersona();

                    (_miPersona as Persona).Id = readers.GetInt32(0);
                    (_miPersona as Persona).Nombre = readers.GetString(1);
                    (_miPersona as Persona).Apellido = readers.GetString(2);
                    (_miPersona as Persona).Fecha = readers.GetString(3);
                    (_miPersona as Persona).Correo = readers.GetString(4);
                    (_miPersona as Persona).Contrasena = readers.GetString(5);
                    (_miPersona as Persona).Usuario = readers.GetString(6);
                    (_miPersona as Persona).Celular = readers.GetString(7);
                }
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion con la base de datos");
            }
            catch (Exception)
            {
                throw new Exception("hacer la exception");
            }
            finally
            {
                bd.CerrarConexion();
            }
            if (Equals(_miPersona) == null)
            {
                return null;
            }
            else
                return _miPersona;
        }

        #endregion Iniciar Sesion

        #region Modificar Persona

        /// <summary>
        /// Método que accede a la base de datos para modificar
        /// los datos de una persona.
        /// </summary>
        /// <param name="_persona"></param>
        /// <returns></returns>
        public bool ModificarPersona(Entidad _persona)
        {
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[UDPPersona]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Id",
                    (_persona as Persona).Id);
                command.Parameters.AddWithValue("@Usuario",
                    (_persona as Persona).Usuario);
                command.Parameters.AddWithValue("@Correo",
                    (_persona as Persona).Correo);
                command.Parameters.AddWithValue("@Celular",
                    (_persona as Persona).Celular);
                command.Parameters.AddWithValue("@Contrasena",
                    (_persona as Persona).Contrasena);

                command.ExecuteReader();

                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            finally
            {
                bd.CerrarConexion();
            }
        }

        #endregion Modificar Persona

        #region Consultar Persona

        /// <summary>
        /// Método que accede a la base de datos para
        /// seleccionar la persona que pertenece a un invernadero.
        /// </summary>
        /// <returns></returns>
        public Entidad ConsultarPersona(Entidad _persona)
        {
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELPersona]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@IdInvernadero",
                (_persona as Persona).Id);

                SqlDataReader readers = command.ExecuteReader();
                _miPersona = FabricaEntidad.NuevaPersona();

                while (readers.Read())
                {
                    (_miPersona as Persona).Celular = readers.GetString(0);
                }
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion con la base de datos");
            }
            finally
            {
                bd.CerrarConexion();
            }

            if (_miPersona == null)
            {
                return null;
            }
            else
                return _miPersona;
        }

        #endregion Consultar Persona   

        #endregion Métodos
    }
}